package com.efounder.form.action;

import com.efounder.action.IAction;
import com.efounder.action.IActionWidget;
import com.efounder.form.base.DataComponent;
import com.efounder.form.model.ModelContainer;

import java.util.ArrayList;
import java.util.List;

/**
 * Action组件的基类
 *
 * @author xiewanzhi
 * @datetime 2015年3月30日 上午10:53:19
 */

public class ActionComponent extends DataComponent implements IAction {

    /**
     * 构造函数
     */
    public ActionComponent() {
        super();
    }

    /**
     * 获取跨域配置的serverID
     *
     * @return
     * @author luzaiquan
     * @date 2018年11月20日下午10:08:18
     */
    public String getServerIDFromModelContainer() {
        ModelContainer modelContainer = (ModelContainer) this.getDataContainer();
        if (modelContainer == null) {
            return null;
        }
        String serverID = modelContainer.getValue("serverID", "").toString();
        return serverID;
    }

    // 功能编号
    private String GNBH = "";

    public String getGNBH() {
        return GNBH;
    }

    public void setGNBH(String gNBH) {
        GNBH = gNBH;
    }

    private int height = 30;

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }

    private int width = 70;

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    private String actionIcon = "";

    /**
     * action图标
     */
    @Override
    public String getActionIcon() {
        return actionIcon;
    }

    /**
     * 设置action图标
     */
    @Override
    public void setActionIcon(String actionIcon) {
        this.actionIcon = actionIcon;
        //相对路径 绝对路径
//        this.actionIcon = serverURL + actionIcon;

        // 更新所有组件的图标
        setActionWidgetListIcon();
    }

    /**
     * 鼠标按下时的图片
     */
    private String mouseDownIcon = "";

    public String getMouseDownIcon() {
        return mouseDownIcon;
    }

    public void setMouseDownIcon(String mouseDownIcon) {
        this.mouseDownIcon = mouseDownIcon;
    }


    /**
     * 重新设置所有关联组件的图标
     */
    private void setActionWidgetListIcon() {
        if (actionWidgetList == null || actionWidgetList.size() == 0) {
            return;
        }
        for (IActionWidget actionWidget : actionWidgetList) {
            setActionWidgetIcon(actionWidget);
        }
    }

    protected String actionText;

    /**
     * Action显示的文本
     */
    @Override
    public String getActionText() {
        return actionText;
    }

    /**
     * 设置Action显示的文本
     */
    @Override
    public void setActionText(String actionText) {
        this.actionText = actionText;

//		fireActionTextChangedEvent(actionText);
    }

    // 当前Action的前边是否存在分隔线
    private boolean separatorBefore = false;

    public boolean getSeparatorBefore() {
        return separatorBefore;
    }

    public void setSeparatorBefore(boolean separatorBefore) {
        this.separatorBefore = separatorBefore;
    }

    // 可视表达式
    private String visibleExpression = null;

    public String getVisibleExpression() {
        return visibleExpression;
    }

    /**
     * 设置action可视表达式
     *
     * @param visibleExpression
     */
    public void setVisibleExpression(String visibleExpression) {
        this.visibleExpression = visibleExpression;
    }

    // 激活表达式
    private String enableExpression = null;

    public String getEnableExpression() {
        return enableExpression;
    }

    /**
     * action是否可用的表达式
     *
     * @param enableExpression
     */
    public void setEnableExpression(String enableExpression) {
        this.enableExpression = enableExpression;
    }

    private boolean enabled = true;

    /**
     * action的可用状态
     */
    public boolean getEnabled() {
        return enabled;
    }

    /**
     * 设置action是否可用的状态
     */
    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
        // 设置actionWidget的状态
        if (actionWidgetList != null) {
            for (int i = 0; i < actionWidgetList.size(); i++) {
//                actionWidgetList.get(i).setEnabled(enabled);
            }
        }
    }

    private boolean forceEnable = false;

//	/**
//	 * 强制组件为可用状态，默认值为false
//	 */
//	@Override
//	public boolean getForceEnable() {
//		return forceEnable;
//	}
//	/**
//	 * 是否强制设置Action为可用状态
//	 */
//	@Override
//	public void setForceEnable(boolean value) {
//		this.forceEnable = value;
//		if ( this.forceEnable ) {
//			this.forceDisable = false;
//		}
//	}

    private boolean forceDisable = false;
//	/**
//	 * 是否强制组件为禁用状态
//	 */
//	@Override
//	public boolean getForceDisable() {
//		return forceDisable;
//	}
//
//	@Override
//	public void setForceDisable(boolean forceDisable) {
//		this.forceDisable = forceDisable;
//		if ( this.forceDisable ) {
//			this.forceEnable = false;
//		}
//	}

    private boolean visible = true;

    public boolean getVisible() {
        return visible;
    }

    public void setVisible(boolean visible) {
        this.visible = visible;
    }

    private Object valueMap;

    public Object getValueMap() {
        return valueMap;
    }

    public void setValueMap(Object valueMap) {
        this.valueMap = valueMap;
    }

    private List<IActionWidget> actionWidgetList = null;

    /**
     * 添加actionWidget
     *
     * @param actionWidget
     */
    public void addActionWidget(IActionWidget actionWidget) {
        if (actionWidget == null) return;

        // 设置组件的图标
        setActionWidgetIcon(actionWidget);

        if (actionWidgetList != null && actionWidgetList.indexOf(actionWidget) != -1) {
            return;
        }
        if (actionWidgetList == null) {
            actionWidgetList = new ArrayList<IActionWidget>();
        }
        actionWidgetList.add(actionWidget);
    }

    /**
     * 获取引用Action的所有组件
     *
     * @return
     */
    public List<IActionWidget> getActionWidgetList() {
        return actionWidgetList;
    }

    /**
     * 设置Action的图标
     *
     * @param actionWidget
     */
    private void setActionWidgetIcon(IActionWidget actionWidget) {
        // 设置引用action组件的图标

    }


    /**
     * 删除actionWidget
     *
     * @param actionWidget
     */
    public void removeActionWidget(IActionWidget actionWidget) {
        if (actionWidget == null || actionWidgetList == null) {
            return;
        }
        if (actionWidgetList.indexOf(actionWidget) == -1) {
            return;
        }
        actionWidgetList.remove(actionWidget);
    }

//	private Map<String, String> visibleMap = null;
//	/**
//	 * 参数可视的参数映射表
//	 */
//	@Override
//	public Map<String, String> getVisibleMap() {
//		return visibleMap;
//	}
//	/**
//	 * 参数可视的参数映射表
//	 * @param value
//	 */
//	@Override
//	public void setVisibleMap(Map<String, String> value) {
//		this.visibleMap = value;
//	}

    /**
     * 执行Action的操作
     */
    @Override
    public void doAction() {

    }

    /**
     * 更新Action的状态
     */
    @Override
    public void doUpdate() {
//		 检查功能权限，如果没有权限，直接禁用
//		if(!GNBH.trim().equals("") && !SecurityManager.checkGNQX(GNBH)) {
//			 this.enabled = false;
//			 return;
//		 }

        // 执行自定义脚本
//		FormScriptUtil.executeCompScripts(this, this.scriptContext, "doUpdate", this, null);

        // 强制为可用状态
        if (forceEnable) {
            this.setEnabled(true);
        }
        // 强制为禁用状态
        if (forceDisable) {
            this.setEnabled(false);
        }
    }

//	private Map<String, String> invisibleMap = null;
//
//	/**
//	 * 不可视的参数映射表
//	 */
//	@Override
//	public Map<String, String> getInvisibleMap() {
//		return invisibleMap;
//	}
//
//	/**
//	 * 不可视的参数映射表
//	 */
//	@Override
//	public void setInvisibleMap(Map<String, String> value) {
//		this.invisibleMap = value;
//	}
//
//	@Override
//	public void checkVisible(boolean needCheck) {
//
//	}
//
//	@Override
//	public Object getValue(String key, Object defVlaue) {
//		return null;
//	}
//
//	@Override
//	public void putValue(String key, Object value) {
//
//	}
//
//	/*
//	 * 顺序执行action
//	 * @see com.efounder.gwt.form.base.IAction#excuteAction()
//	 */
//	@Override
//	public void excuteAction() {
//		// 检查功能权限
//		if ( GNBH != null && GNBH.trim().length() > 0 ) {
//			boolean existQX = SecurityManager.checkGNQX(GNBH);
//			if ( !existQX ) {
//				Window.alert("当前用户无此功能权限!");
//				return;
//			}
//		}
//		// action执行之前的操作
//		Object resFlag = beforeDoAction();
//		// 如果返回0，则不再执行action操作
//		if ( "0".equals(resFlag) ) {
//			return;
//		}
//		// 执行action
//		doAction();
//		// action执行之后的操作
//		afterDoAction();
//
//		// 记录操作日志
//		if ( EAI.isRecordOpLog() || isOperateLog ) {
//			String log = operateLog;
//			if ( log == null || log.trim().length() == 0 ) {
//				log = actionText;
//			}
//			// 日志对象
//			OperationLog operateLog = new OperationLog();
//			operateLog.setF_GNBH(getGNBH());
//			operateLog.setF_GNMC(log);
//			// 添加功能模块，liliang，2018.07.13
//			String gnmk = null;
//			ModelContainer dataContainer = getDataContainer();
//			if (dataContainer != null) {
//			    gnmk = dataContainer.getValue("caption", "").toString();
//			}
//			operateLog.setF_GNMK(gnmk);
//
//			// 如果能获取到自定义的日志操作类，则用自定义的日志操作类记录日志。liliang，2018.10.17
//			ILoggerManager customLoggerManager = LoggerManager.getCustomLoggerManagerClazz();
//			if (customLoggerManager != null) {
//			    customLoggerManager.writeLog(operateLog, JParamObject.create(), this);
//			} else {
//			    // 调用服务，接入日志
//	            LoggerManager.writeLog(operateLog, JParamObject.create());
//			}
//		}
//	}
//
//	/*
//	 * action执行之前执行
//	 * @see com.efounder.gwt.form.base.IAction#beforeDoAction()
//	 */
//	@Override
//	public Object beforeDoAction() {
//		return null;
//	}
//
//	/*
//	 * action执行之后执行
//	 * @see com.efounder.gwt.form.base.IAction#afterDoAction()
//	 */
//	@Override
//	public Object afterDoAction() {
//		return null;
//	}
//
//	private Map enabledMap;
//
//	@Override
//	public Map getEnabledMap() {
//		return enabledMap;
//	}
//
//	@Override
//	public void setEnabledMap(Map value) {
//		enabledMap = value;
//	}
//
//	private Map disenabledMap;
//	@Override
//	public Map getDisenabledMap() {
//		return disenabledMap;
//	}
//
//	@Override
//	public void setDisenabledMap(Map value) {
//		disenabledMap = value;
//	}

    private boolean isOperateLog = false;

    /**
     * 是否记录操作日志
     *
     * @return
     */
    public boolean getIsOperateLog() {
        return isOperateLog;
    }

    /**
     * 设置是否记录操作日志
     *
     * @param isOperateLog
     */
    public void setIsOperateLog(boolean isOperateLog) {
        this.isOperateLog = isOperateLog;
    }

    private String operateLog = "";

    /**
     * 获取操作日志
     *
     * @return
     */
    public String getOperateLog() {
        return operateLog;
    }

    /**
     * 设置操作日志
     *
     * @param operateLog
     */
    public void setOperateLog(String operateLog) {
        this.operateLog = operateLog;
    }

    //---------------------------------------------
    // 开始：实现IGwtRegister
    //---------------------------------------------

//	@Override
//	public void register() {
//		super.register();
//		registerActionComponent();
//	}
//
//	public native void registerActionComponent() /*-{
//		this.getId = this.@com.efounder.gwt.form.base.ActionComponent::getId();
//		this.getGNBH = this.@com.efounder.gwt.form.base.ActionComponent::getGNBH();
//		this.setGNBH = this.@com.efounder.gwt.form.base.ActionComponent::setGNBH(Ljava/lang/String;);
//		this.doAction = this.@com.efounder.gwt.form.base.ActionComponent::doAction();
//		this.setEnabled = this.@com.efounder.gwt.form.base.ActionComponent::setEnabled(Z);
//		this.getEnabled = this.@com.efounder.gwt.form.base.ActionComponent::getEnabled();
//		this.setVisible = this.@com.efounder.gwt.form.base.ActionComponent::setVisible(Z);
//		this.getVisible = this.@com.efounder.gwt.form.base.ActionComponent::getVisible();
//		this.setActionText = this.@com.efounder.gwt.form.base.ActionComponent::setActionText(Ljava/lang/String;);
//		this.setActionIcon = this.@com.efounder.gwt.form.base.ActionComponent::setActionIcon(Ljava/lang/String;);
//		this.setOperateLog = this.@com.efounder.gwt.form.base.ActionComponent::setOperateLog(Ljava/lang/String;);
//	}-*/;
//
//	//---------------------------------------------
//	// 结束：实现IGwtRegister
//	//---------------------------------------------
//
//	//---------------------------------------------
//	// 开始：实现HasActionTextLoadedHandler
//	//---------------------------------------------
//
//	final private HandlerManager handlerManager = new HandlerManager(this);
//	/**
//	 * baiguanghong 2017年8月29日
//	 * 实现HasHandlers的接口方法，派发事件
//	 */
//	@Override
//	public void fireEvent(GwtEvent<?> event) {
//		if ( handlerManager != null ) {
//			handlerManager.fireEvent(event);
//		}
//	}
//
//	/**
//	 * 添加action名称加载完成事件
//	 */
//	@Override
//	public HandlerRegistration addTextChangedHandler(
//			ActionTextChangedHandler handler) {
//		return handlerManager.addHandler(ActionTextChangedEvent.getType(), handler);
//	}
//
//	/**
//	 * 派发action名称加载完成事件
//	 */
//	private void fireActionTextChangedEvent(String actionText) {
//		ActionTextChangedEvent event = new ActionTextChangedEvent(actionText);
//		this.fireEvent(event);
//	}
//
    //---------------------------------------------
    // 结束：实现HasActionTextLoadedHandler
    //---------------------------------------------

    /**
     * 快捷键
     */
    private String shortcutKey = null;

    /**
     * 快捷键
     *
     * @return
     */
    public String getShortcutKey() {
        return shortcutKey;
    }

    /**
     * 设置触发快捷键
     *
     * @param shortcutKey
     */
    public void setShortcutKey(String shortcutKey) {
        this.shortcutKey = shortcutKey;
    }

}